home *** CD-ROM | disk | FTP | other *** search
- unit GS_FileH;
- {------------------------------------------------------------------------------
- File Handler
-
- Copyright (c) Richard F. Griffin
-
- 20 February 1992
-
- 102 Molded Stone Pl
- Warner Robins, GA 31088
-
- -------------------------------------------------------------
- This unit handles all untyped files. Also provides file directory
- search and selection.
-
- Since all calls come through here for untyped files, this is a point
- to trap the calls in the future for shared file handling.
-
- Changes:
-
- 19 Feb 92 - Deleted buffering to speed indexed retrievals.
-
- ------------------------------------------------------------------------------}
-
- interface
- {$d-}
-
- uses
- CRT,
- Dos,
- GS_Strng,
- GS_Error;
-
- var
- GS_FileDrvTab : array[0..127] of char;
- GS_FileDrvCnt : byte;
-
- BRCmd,
- BWCmd,
- IOAsk,
- IORed,
- IOWri,
- IOPhy : word;
-
- Procedure GS_FileAssign(var dF : file; Fname : string);
- Procedure GS_FileClose(var dF : file);
- Procedure GS_FileErase(var dF : file);
- Function GS_FileExists(var dF : file; Fname : string) : boolean;
- Procedure GS_FileRead(var dF : file; blk : longint; var dat; len : longint;
- var RtnRslt : word);
- Procedure GS_FileRename(var dF : file; FName : string);
- Procedure GS_FileReset(var dF : file; len : longint);
- Procedure GS_FileRewrite(var dF : file; len : longint);
- Function GS_FileSize(var dF : file) : longint;
- Procedure GS_FileTruncate(var dF : file; loc : longint);
- Procedure GS_FileWrite(var dF : file; blk : longint; var dat; len : longint;
- var RtnRslt : word);
- function GS_FileFindFiles(pth, fname : string; LookElseWhere : boolean)
- : string;
-
- implementation
-
- uses
- GS_Pick,
- GS_Winfc;
-
- type
- BufrRec = record
- Size : word; {Size of buffer}
- CntByt : word; {Bytes stores in buffer}
- Posn : longint; {Beginning byte of file in buffer}
- FPosn : longint; {Last byte read + 1 in buffer}
- BufPtr : Pointer;
- end;
-
- var
- Bufr : BufrRec;
- dbfErr : integer;
- Blok,
- TPosS,
- TPosE : longint;
- StrFil : string[80];
- istrue : boolean;
-
- cdriv : byte;
- tdrv : byte;
- regs : Registers;
-
- ShoWin : GS_Wind_Objt;
-
- Procedure GS_FileAssign(var dF : file; Fname : string);
- var
- dFa : FileRec absolute dF;
- begin
- Assign(df, FName);
- Bufr.Posn := -1;
- Bufr.FPosn := 0;
- Bufr.CntByt := 0;
- Bufr.Size := 0;
- Bufr.BufPtr := nil;
- move(Bufr, dFa.UserData, sizeof(Bufr));
- end;
-
- Procedure GS_FileClose(var dF : file);
- var
- dFa : FileRec absolute dF;
- begin
- Close(df);
- end;
-
- Procedure GS_FileErase(var dF : file);
- begin
- Erase(df);
- end;
-
- Function GS_FileExists(var dF : file; Fname : string) : boolean;
- begin
- if (FName <> '') then
- begin
- {$I-}
- Assign(dF, FName);
- Reset(dF);
- Close(dF);
- {$I+}
- GS_FileExists := (IOResult = 0);
- end else GS_FileExists := false;
- end;
-
- Procedure GS_FileRead(var dF : file; blk : longint; var dat; len : longint;
- var RtnRslt : word);
- var
- dFa : FileRec absolute dF;
- Result : word;
- StrFil : string[80];
- begin
- move(dFa.UserData, Bufr, sizeof(Bufr));
- if blk = -1 then blk := succ(Bufr.Posn);
- dbfErr := 0;
- begin
- (*$I-*) Seek(dF, blk); (*$I+*)
- dbfErr := IOResult;
- end;
- IF dbfErr = 0 THEN {If seek ok, read the record}
- BEGIN
- inc(BRCmd);
- (*$I-*)
- BlockRead(dF, dat, len, Result);
- (*$I+*)
- RtnRslt := Result;
- dbfErr := IOResult;
- if dbfErr = 0 then
- begin
- Bufr.Posn := blk + (len-1);
- move(Bufr, dFa.UserData, sizeof(Bufr));
- end;
- end;
- if dbfErr <> 0 then
- begin
- CnvAscToStr(dFa.Name,StrFil,64);
- ShowError(dbfErr,StrFil);
- end;
- end;
-
- Procedure GS_FileRename(var dF : file; Fname : string);
- begin
- Rename(df, FName);
- end;
-
- Procedure GS_FileReset(var dF : file; len : longint);
- var
- dFa : FileRec absolute dF;
- StrFil : string[80];
- begin
- (*$I-*) Reset(dF, len); (*$I+*)
- dbfErr := IOResult;
- if dbfErr <> 0 then
- begin
- CnvAscToStr(dFa.Name,StrFil,64);
- ShowError(dbfErr,StrFil);
- end;
- end;
-
- Procedure GS_FileRewrite(var dF : file; len : longint);
- var
- dFa : FileRec absolute dF;
- StrFil : string[80];
- begin
- (*$I-*) Rewrite(dF, len); (*$I+*)
- dbfErr := IOResult;
- if dbfErr <> 0 then
- begin
- CnvAscToStr(dFa.Name,StrFil,64);
- ShowError(dbfErr,StrFil);
- end;
- end;
-
- Function GS_FileSize(var dF : file) : longint;
- begin
- GS_FileSize := FileSize(df);
- end;
-
-
- Procedure GS_FileTruncate(var dF : file; loc : longint);
- var
- dFa : FileRec absolute dF;
- begin
- move(dFa.UserData, Bufr, sizeof(Bufr));
- if loc = -1 then loc := succ(Bufr.Posn);
- dbfErr := 0;
- (*$I-*) Seek(dF, loc); (*$I+*)
- dbfErr := IOResult;
- if dbfErr <> 0 then
- begin
- CnvAscToStr(dFa.Name,StrFil,64);
- ShowError(dbfErr,StrFil);
- end;
- Truncate(df);
- Bufr.Posn := loc;
- move(Bufr, dFa.UserData, sizeof(Bufr));
- end;
-
-
- Procedure GS_FileWrite(var dF : file; blk : longint; var dat; len : longint;
- var RtnRslt : word);
- var
- dFa : FileRec absolute dF;
- Result : word;
- StrFil : string[80];
- begin
- move(dFa.UserData, Bufr, sizeof(Bufr));
- if blk = -1 then blk := succ(Bufr.Posn);
- dbfErr := 0;
- (*$I-*) Seek(dF, blk); (*$I+*)
- dbfErr := IOResult;
- IF dbfErr = 0 THEN {If seek ok, read the record}
- BEGIN
- (*$I-*) BlockWrite(dF, dat, len, Result); (*$I+*)
- RtnRslt := Result;
- dbfErr := IOResult;
- IF dbfErr = 0 THEN {If seek ok, read the record}
- BEGIN
- Bufr.Posn := blk + (len-1);
- move(Bufr, dFa.UserData, sizeof(Bufr));
- end;
- end;
- if dbfErr <> 0 then
- begin
- CnvAscToStr(dFa.Name,StrFil,64);
- ShowError(dbfErr,StrFil);
- end;
- end;
-
- function GS_FileFindFiles(pth, fname : string; LookElseWhere : boolean)
- : string;
- var
- DirInfo : SearchRec;
- FilTabl : array[1..512] of string[12];
- Labl : string;
- DirNow,
- DirNam,
- DirCur : PathStr;
- DSt : DirStr;
- NSt : NameStr;
- ESt : ExtStr;
- itms : integer;
- rfil : integer;
- rdir : integer;
- slct : integer;
- lctn : integer;
- wtx,
- wbg,
- wfg,
- wti,
- wbi : byte;
- wx1,
- wy1,
- wx2,
- wy2 : integer;
-
- procedure MakeFileTable;
- var
- i : integer;
- d : string;
- v : char;
- u : byte absolute v;
- b : byte;
- begin
- itms := 0;
- FindFirst(Labl, Archive, DirInfo);
- while DosError = 0 do
- begin
- inc(itms);
- FilTabl[itms] := DirInfo.Name;
- FindNext(DirInfo);
- end;
- rfil := itms;
- if itms > 0 then
- GS_Pick_Item_Sort(FilTabl[1],sizeof(FilTabl[1]),itms,true);
- if LookElseWhere then
- begin
- FindFirst('*.', Directory, DirInfo);
- while DosError = 0 do
- begin
- if (DirInfo.Attr = directory) and (DirInfo.Name <> '.') then
- begin
- inc(itms);
- for i := 1 to length(DirInfo.Name) do
- begin
- v := DirInfo.Name[i];
- if v in ['A'..'Z'] then u := u + 32;
- DirInfo.Name[i] := v;
- end;
- FilTabl[itms] := DirInfo.Name+'\';
- end;
- FindNext(DirInfo);
- end;
- rdir := itms;
- if itms-rfil > 0 then
- GS_Pick_Item_Sort(FilTabl[succ(rfil)],sizeof(FilTabl[1]),
- itms-rfil,true);
- for i := 0 to pred(GS_FileDrvCnt) do
- begin
- if GS_FileDrvTab[i] = 'P' then
- begin
- inc(itms);
- FilTabl[itms] := chr(i+65)+':\';
- end;
- end;
- end;
- end;
-
- begin
- GS_Wind_GetWinSize(wx1,wy1,wx2,wy2);
- if (wx2-wx1 < 16) or (wy2-wy1 < 7) then
- begin
- ShowError(777,'Window too small for file display');
- GS_FileFindFiles := '';
- exit;
- end;
- GS_Wind_GetColors(wtx,wbg,wfg,wti,wbi);
- ShoWin.InitWin(wx1+1,wy1+1,wx1+15,wy2-3,wti,wbi,wfg,wtx,wbg,true,'',true);
- GetDir(0,DirNow);
- if pth <> '' then
- begin
- FSplit(pth, DSt, NSt, ESt);
- DSt[0] := pred(DSt[0]);
- (*$I-*) ChDir(DSt) (*$I+*);
- end;
- GetDir(0,DirNam);
- DirCur := DirNam;
- repeat
- if DirNam[length(DirNam)] <> '\' then DirNam := DirNam + '\';
- GoToXY(2,(wy2-wy1)-1);
- Write('Dir = ',DirNam);
- Labl := DirNam+fname;
- MakeFileTable;
- if itms > 0 then
- begin
- ShoWin.SetWin;
- slct := GS_Pick_Row_Item(FilTabl, 13, itms, 1);
- ShoWin.RelWin;
- ClrScr;
- end else slct := 0;
- if slct > rfil then
- begin
- if slct > rdir then (*$I-*) ChDir(DirCur) (*$I+*);
- DirNam := FilTabl[slct];
- DirNam[0] := pred(DirNam[0]);
- (*$I-*) ChDir(DirNam) (*$I+*);
- GetDir(0,DirNam);
- if slct > rdir then DirCur := DirNam;
- end;
- if (slct > 0) and (slct <= rfil) then
- Labl := FilTabl[slct] else Labl := '';
- lctn := pos('.',Labl);
- if lctn > 0 then delete(Labl,lctn,4);
- until slct <= rfil;
- if DirNam[length(DirNam)] <> '\' then DirNam := DirNam + '\';
- if Labl <> '' then GS_FileFindFiles := DirNam+Labl
- else GS_FileFindFiles := '';
- if slct = 0 then GS_FileFindFiles := '-';
- ChDir(DirNow);
- end;
-
-
- begin
- IOAsk := 0;
- IOPhy := 0;
- IORed := 0;
- IOWri := 0;
- BRCmd := 0;
- BWCmd := 0;
- {Build Drive Table}
- regs.ah := 25;
- MsDos(regs);
- cdriv := regs.al;
- regs.dl := cdriv;
- regs.ah := 14;
- MsDos(regs);
- GS_FileDrvCnt := regs.al;
- tdrv := 0;
- while tdrv < GS_FileDrvCnt do
- begin
- regs.dl := tdrv;
- regs.ah := 14;
- MsDos(regs);
- regs.ah := 25;
- MsDos(regs);
- if tdrv = regs.al then GS_FileDrvTab[tdrv] := 'P'
- else GS_FileDrvTab[tdrv] := ' ';
- inc(tdrv);
- end;
- regs.dl := cdriv;
- regs.ah := 14;
- MsDos(regs);
- end.
-